# -*- coding:utf-8 -*-
__author__ = 'Serprutiy'


class A(object):
    def __init__(self):
        print("init")

    def __new__(cls, *args, **kwargs):
        print('new %s' % cls)
        return object.__new__(cls, *args, **kwargs)


A()
# A()运行效果为：
# new <class '__main__.A'>
# init
# 运行效果说明：1、先执行的是__new__接口；2、然后执行的是__init__接口；

# 相关知识点：
# 1、继承自object的新式类才有__new__方法；
# 2、__new__至少要有一个参数cls，代表要实例化的类，此参数在实例化时由python解释器提供；
# 3、__new__必须要有返回值，返回实例化出来的实例，这点在自己实现__new__时特别注意，可以return父类__new__出来的实例，或者
#    直接是object的__new__出来的实例
# 4、__init__有一个参数self，就是这个__new__返回的实例；
# 5、__init__在__new__的基础上可以完成一些其他初始化的动作，__init__不要返回值；
# 6、若__new__没有正确返回当前类cls的实例，那么__init__是不会被调用的，即使是父类的实例也不行；
# 7、__new__()方法是在类准备将自身实例化时调用；
# 8、__new__()方法始终时类的静态方法，即使没有被加上静态方法装饰器；


class B(A):
    def __init__(self):
        print("B init")

    def __new__(cls, *args, **kwargs):
        print('new %s' % cls)
        return object.__new__(cls, *args, **kwargs)     # 调用父类的__new__方法
        # return object.__new__(A, *args, **kwargs)     返回的是父类的实例

b = B()
print(type(b))

# type和object的区别：
# 1、object描述：
#   class object:
#     """ The most base type """
#   是python对类型统一做出的努力，object是定义的一个类型的“空类”
# 2、type描述：
#     class type(object):
#         """
#         type(object) -> the object's type
#         type(name, bases, dict) -> a new type
#         """
#   其中type定义了很多方法，可以认为是一个帮助类。
# 3、使用时，如果定义类想尽可能偷懒，可以直接从type继承，否则建议object继承。